package com.llu.serial.fastjson;

import com.llu.serial.fastjson.deserializer.ObjectDeserializer;
import com.llu.serial.fastjson.serializer.ObjectSerializer;

import java.lang.reflect.Type;

public class JSON {

    /**
     * 将类对象转换为JSON格式的字符串（序列化）
     * <p>
     * 本方法主要用于将Java中的对象转换为JSON字符串，便于数据传输或存储。
     * 它通过获取全局配置的序列化器来处理不同类型的对象。
     *
     * @param object 要转换为JSON字符串的类对象
     * @return 转换后的JSON字符串
     */
    public static String toJSONString(Object object){
        // 获取全局配置对象中对应于当前对象类型的序列化器
        ObjectSerializer serializer = JsonConfig.getGlobInstance().getSerializer(object.getClass());
        // 创建StringBuilder用于高效拼接JSON字符串
        StringBuilder sb = new StringBuilder();
        // 调用序列化器的serializer方法对对象进行序列化操作
        serializer.serializer(null, JsonConfig.getGlobInstance(), sb, object);
        // 返回拼接完成的JSON字符串
        return sb.toString();
    }


    /**
     * 将JSON字符串解析为指定类的对象
     * 此方法用于将给定的JSON字符串表示的数据解析为特定Java类的实例
     *
     * @param json 要解析的JSON字符串
     * @param clazz 目标Java类的Class对象，用于指定解析后的对象类型
     * @param <T> 泛型标记，表示目标解析的对象类型
     * @return 解析后的Java对象如果解析失败，返回null
     */
    public static <T> T parse(String json, Class<T> clazz) {
        return parse(json, (Type) clazz);
    }

    /**
     * 将JSON字符串解析为指定类型的对象
     * 此方法更通用，可以处理包括泛型在内的复杂类型解析
     *
     * @param json 要解析的JSON字符串
     * @param type 目标类型，可以是Class对象，也可以是ParameterizedType等复杂类型
     * @param <T> 泛型标记，表示目标解析的对象类型
     * @return 解析后的Java对象如果解析失败，返回null
     */
    public static <T> T parse(String json, Type type) {
        // 根据全局配置获取对应类型的反序列化器
        ObjectDeserializer deserializer = JsonConfig.getGlobInstance().getDeserializer(type);
        try {
            // 使用反序列化器进行JSON字符串到Java对象的转换
            return deserializer.deserializer(JsonConfig.getGlobInstance(), json, null);
        } catch (Throwable throwable) {
            // 如果发生异常，打印异常信息
            throwable.printStackTrace();
        }
        // 如果发生异常或解析失败，返回null
        return null;
    }


}
